// src/utils/coordinate-converter.ts
/**
 * GCJ-02(高德) 转换为 WGS84(原始坐标)
 * 纯数学实现，不依赖任何外部库
 */

// 判断点是否在中国范围内
function outOfChina(lng: number, lat: number): boolean {
  return (lng < 72.004 || lng > 137.8347) ||
    (lat < 0.8293 || lat > 55.8271);
}

// 纬度转换函数
function transformLat(x: number, y: number): number {
  let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
  ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
  ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
  ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
  return ret;
}

// 经度转换函数
function transformLng(x: number, y: number): number {
  let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
  ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
  ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
  ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
  return ret;
}

// 主转换函数
export function convertGaodeToWgs84(gaodeLon: number, gaodeLat: number): [number, number] {
  // 在中国境外直接返回原坐标
  if (outOfChina(gaodeLon, gaodeLat)) {
    return [gaodeLon, gaodeLat];
  }

  // 计算偏移量
  const dLat = transformLat(gaodeLon - 105.0, gaodeLat - 35.0);
  const dLng = transformLng(gaodeLon - 105.0, gaodeLat - 35.0);

  // 地球半径（米）
  const radLat = gaodeLat / 180.0 * Math.PI;
  let magic = Math.sin(radLat);
  magic = 1 - 0.00669342162296594323 * magic * magic;
  const sqrtMagic = Math.sqrt(magic);

  // 计算修正后的经纬度
  const dLatCorrection = dLat * 180.0 / (6378245.0 * (1 - 0.00669342162296594323) / (magic * sqrtMagic) * Math.PI);
  const dLngCorrection = dLng * 180.0 / (6378245.0 / sqrtMagic * Math.cos(radLat) * Math.PI);

  // 返回WGS84坐标
  return [
    gaodeLon - dLngCorrection,
    gaodeLat - dLatCorrection
  ];
}
